// import 语句的路径只支持相对路径
import axios from '../../request/myAxios';
// 这个文件是用来支持让更多机型支持 async await 语法
import regeneratorRuntime, { async } from '../../lib/runtime/runtime';

Page({

  // 页面数据
  data: {
    address: {},
    totalPrice: 0,
    cart: [],
    selectCount: 0
  },
  // 获取用户收货地址的函数
  // 生命周期函数和同级的函数不要写成箭头函数，需要用箭头函数属性的是 API 的回调函数
  getUserAddress() {
    // 获取用户授权设置
    wx.getSetting({
      // 从返回值中解构 authSetting 对象
      success: ({ authSetting }) => {
        // 获取通讯地址的授权情况
        const scopeAddress = authSetting["scope.address"];
        // scopeAddress 有三种结果：
        //   1. undefined 重来<没有调用过>获取通讯地址的 API
        //   2. true   调用过获取通讯地址的 API，并且用户<允许>授权
        //   3. false  调用过获取通讯地址的 API，但是用户<拒绝>授权
        // 实现思路：
        //   1. undefined 和 true 的情况，就直接调用通讯地址 API
        //   2. false 被拒绝过无法调用API，打开设置界面，引导用户开启授权
        if (scopeAddress === undefined || scopeAddress === true) {
          // 调用通讯地址 API
          wx.chooseAddress({
            success: (result) => {
              console.log('用户收货地址信息', result);
              // 注意 this 的指向是页面实例的时候，才能调用 setData 方法。
              // 技巧：涉及到微信 API 的回调函数，统一用箭头函数的写回调函数。
              // console.log(this);
              const { userName, telNumber, provinceName, cityName, countyName, detailInfo } = result;

              // 1. 详细地址
              // 2. 收货人名字
              // 3. 收货人手机号码
              const address = {
                userName,
                telNumber,
                addressDetail: provinceName + cityName + countyName + detailInfo
              };

              // 保存到本地存储
              wx.setStorageSync('address', address);

              // 更新视图
              this.setData({ address });

            }
          });
        } else {
          // 打开当前小程序的设置界面 - 需要嵌套在 wx.getSetting() 中使用。
          wx.openSetting();
        }
      }
    });
  },
  // 当页面显示显示的时候，获取本地存储的收货地址
  onShow() {
    // 读取本地存储
    const address = wx.getStorageSync('address') || {};
    const cart = wx.getStorageSync('cart') || [];
    // 更新视图
    this.setData({ address });
    this.computedCart(cart);

  },
  // 更新视图数据和本地存储数据的方法封装
  computedCart(cart) {
    // 假设默认为假
    let totalPrice = 0, selectCount = 0;

    // 遍历购物车的选中元素
    cart.forEach(item => {
      // 选中的商品
      if (item.isSelect) {
        // 选中个数累加
        selectCount++;
        // 选中商品价格累加   +=  商品单价 * 商品数量
        totalPrice += item.goods_price * item.count;
      }
    });
    // 更新购物车列表视图
    this.setData({ cart, totalPrice, selectCount });
    // 更新本地存储购物车数据
    wx.setStorageSync('cart', cart);
  },
  // 支付当前订单
  async payCurrentOrder() {
    const { address } = this.data;
    if (!address.userName) {
      wx.showToast({
        title: '请选择收货地址',
        icon: 'none'
      });
      // 如果没有选择收货地址，就无需往后再运行了
      return;
    }

    // 判断本地是否有 token ，识别用户是否登录了
    //    1. 未登录，没有 token，跳转页面，获取 token。
    //    2. 已登录，创建订单，最终并支付订单。

    // 获取本地存储的 token
    const token = wx.getStorageSync('token') || '';
    if (!token) {
      // 跳转授权页面
      wx.navigateTo({
        url: '/pages/auth/index',
      });

    } else {
      // console.log('已登录，创建订单，最终并支付订单。');
      // 支付流程一定是要按顺序执行，用同步的方式书写更方便
      try {
        // 1. 创建订单
        const { order_number } = await this.creatOrder();
        // 2. 准备预支付数据
        const { pay } = await this.createPayData(order_number);
        // 3. 发起微信支付
        const { errMsg } = await this.requestPayment(pay);
        // 4. 查询订单支付状态
        const res = await this.checkOrderPay(order_number);

        // 支付成功后业务
        this.payOrderSuccess();

      } catch (error) {
        // 出现错误的话，给用户提示
        wx.showToast({
          title: '出现错误，支付失败',
          icon: 'none'
        });
      }

    }
  },
  // 1. 创建订单
  creatOrder() {
    // 结构购物车数据，总金额，收货地址
    const { cart, totalPrice, address } = this.data;
    // 商品列表格式处理
    const goods = cart
      .filter(v => v.isSelect)
      .map(v => ({ goods_id: v.goods_id, goods_number: v.count, goods_price: v.goods_price }));
    // 发送请求创建订单
    // 返回 Promise 对象
    return axios({
      url: '/my/orders/create',
      method: 'POST',
      data: {
        // 订单总价格
        order_price: totalPrice,
        consignee_addr: address.addressDetail,
        // 注意 goods 参数的格式，需要按文档接口要求来传递
        goods: goods
      }
    });
  },
  // 2. 准备预支付数据
  createPayData(order_number) {
    return axios({
      url: '/my/orders/req_unifiedorder',
      method: 'POST',
      data: {
        order_number
      }
    });
  },
  // 3. 发起微信支付，改造成返回 Promise 对象
  requestPayment(pay) {
    // 返回 Promise 对象，用于 await 同步写法
    return new Promise((resolve, reject) => {
      // 微信支付的 API 
      wx.requestPayment({
        ...pay,
        success: res => {
          resolve(res);
        },
        fail: err => {
          reject(err);
        }
      });
    });
  },
  // 4. 查询订单支付状态
  checkOrderPay(order_number) {
    return axios({
      url: '/my/orders/chkOrder',
      method: 'POST',
      data: {
        order_number
      }
    });
  },
  // 支付成功后的业务
  payOrderSuccess() {
    //   1. 清除购物车选中商品
    const { cart } = this.data;
    // 用 filter 过滤出未选中的商品
    const newCart = cart.filter(v => !v.isSelect);
    // 把新的购物车数据保存到本地存储中
    wx.setStorageSync('cart', newCart);
    //   2. 跳转到订单页面 - 关闭当前页面，跳转到应用内的某个页面(重定向)
    wx.redirectTo({
      url: '/pages/order/index',
    });
  }
});